package com.riekoff.particlecubeworld.player;

import cc.creativecomputing.graphics.CCDrawMode;
import cc.creativecomputing.graphics.CCGraphics;
import cc.creativecomputing.graphics.CCVBOMesh;
import cc.creativecomputing.math.CCMath;
import cc.creativecomputing.math.CCVector3f;

public class ATileWorldBox{
	private CCVector3f _myDimension;
	private CCVector3f _myPosition;
	
	public ATileWorldBox(CCVector3f theDimension, CCVector3f thePosition){
		_myDimension = theDimension;
		_myPosition = thePosition;
		_myPosition.x = CCMath.floor(thePosition.x / 10) * 10;
		_myPosition.y = CCMath.floor(thePosition.y / 10) * 10;
		_myPosition.z = CCMath.floor(thePosition.z / 10) * 10;
	}
	
	public void draw(CCGraphics g){
		g.pushMatrix();
//		final float x1 = _myPosition.x - _myDimension.x / 2f;
//		final float x2 = _myPosition.x + _myDimension.x / 2f;
//		final float y1 = _myPosition.y - _myDimension.y / 2f;
//		final float y2 = _myPosition.y + _myDimension.y / 2f;
//		final float z1 = _myPosition.z - _myDimension.z / 2f;
//		final float z2 = _myPosition.z + _myDimension.z / 2f;

		final float x1 = _myPosition.x;
		final float x2 = _myPosition.x + _myDimension.x;
		final float y1 = _myPosition.y;
		final float y2 = _myPosition.y + _myDimension.y;
		final float z1 = _myPosition.z;
		final float z2 = _myPosition.z + _myDimension.z;

		
		g.beginShape(CCDrawMode.QUADS);

		float u1,v1,u2,v2;
		u1 = (x1) / 1000 + 10;
		v1 = (y1) / 1000 + 10;
		u2 = (x2) / 1000 + 10;
		v2 = (y2) / 1000 + 10;
		
		// front
		g.normal(0,0,-1);
		g.textureCoords(0, u1, v2);
		g.textureCoords(1, u1, v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 1, 2);
		g.textureCoords(5, 0, 1, 0);
		
		g.vertex(x1, y2, z1);
		
		g.textureCoords(0, u2, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 1, 2);
		g.textureCoords(5, 1, 1, 0);
		
		g.vertex(x2, y2, z1);
		
		g.textureCoords(0, u2, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 1, 2);
		g.textureCoords(5, 1, 0, 0);
		
		g.vertex(x2, y1, z1);
		
		g.textureCoords(0, u1, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 1, 2);
		g.textureCoords(5, 1, 1, 1);
		
		g.vertex(x1, y1, z1);
		
		u1 = (z1) / 1000 + 10;
		v1 = (y1) / 1000 + 10;
		u2 = (z2) / 1000 + 10;
		v2 = (y2) / 1000 + 10;

		// right
		g.normal(1,0,0);
		g.textureCoords(0, u1, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x2, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 2, 1, 0);
		g.textureCoords(5, 1, 1, 0);
		
		g.vertex(x2, y2, z1);
		
		g.textureCoords(0, u2, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x2, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 2, 1, 0);
		g.textureCoords(5, 1, 1, 1);
		
		g.vertex(x2, y2, z2);
		
		g.textureCoords(0, u2, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x2, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 2, 1, 0);
		g.textureCoords(5, 1, 0, 1);
		
		g.vertex(x2, y1, z2);
		
		g.textureCoords(0, u1, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x2, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 2, 1, 0);
		g.textureCoords(5, 1, 0, 0);
		
		g.vertex(x2, y1, z1);
		
		u1 = (x1) / 1000 + 10;
		v1 = (y1) / 1000 + 10;
		u2 = (x2) / 1000 + 10;
		v2 = (y2) / 1000 + 10;

		// back
		g.normal(0,0,1);
		g.textureCoords(0, u2, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z2);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 1, 2);
		g.textureCoords(5, 1, 1, 1);
		
		g.vertex(x2, y2, z2);
		
		g.textureCoords(0, u1, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z2);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 1, 2);
		g.textureCoords(5, 0, 1, 1);
		
		g.vertex(x1, y2, z2);
		
		g.textureCoords(0, u1, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z2);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 1, 2);
		g.textureCoords(5, 0, 0, 1);
		
		g.vertex(x1, y1, z2);
		
		g.textureCoords(0, u2, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z2);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 1, 2);
		g.textureCoords(5, 1, 0, 1);
		
		g.vertex(x2, y1, z2);
		
		u1 = (z1) / 1000 + 10;
		v1 = (y1) / 1000 + 10;
		u2 = (z2) / 1000 + 10;
		v2 = (y2) / 1000 + 10;

		// left
		g.normal(-1,0,0);
		g.textureCoords(0, u2, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 2, 1, 0);
		g.textureCoords(5, 0, 1, 1);
		
		g.vertex(x1, y2, z2);
		
		g.textureCoords(0, u1, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 2, 1, 0);
		g.textureCoords(5, 0, 1, 0);
		
		g.vertex(x1, y2, z1);
		
		g.textureCoords(0, u1, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 2, 1, 0);
		g.textureCoords(5, 0, 0, 0);
		
		g.vertex(x1, y1, z1);
		
		g.textureCoords(0, u2, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 2, 1, 0);
		g.textureCoords(5, 0, 0, 1);
		
		g.vertex(x1, y1, z2);
		
		u1 = (x1) / 1000 + 10;
		v1 = (z1) / 1000 + 10;
		u2 = (x2) / 1000 + 10;
		v2 = (z2) / 1000 + 10;

		// top
		g.normal(0,-1,0);
		g.textureCoords(0, u1, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 2, 1);
		g.textureCoords(5, 0, 0, 0);
		
		g.vertex(x1, y1, z1);
		
		g.textureCoords(0, u2, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 2, 1);
		g.textureCoords(5, 1, 0, 0);
		
		g.vertex(x2, y1, z1);
		
		g.textureCoords(0, u2, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 2, 1);
		g.textureCoords(5, 1, 0, 1);
		
		g.vertex(x2, y1, z2);
		
		g.textureCoords(0, u1, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y1, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 2, 1);
		g.textureCoords(5, 0, 0, 1);
		
		g.vertex(x1, y1, z2);
		
		u1 = (x1) / 1000 + 10;
		v1 = (z1) / 1000 + 10;
		u2 = (x2) / 1000 + 10;
		v2 = (z2) / 1000 + 10;

		// bottom
		g.normal(0,1,0);
		g.textureCoords(0, u1, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y2, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 2, 1);
		g.textureCoords(5, 0, 1, 1);
		
		g.vertex(x1, y2, z2);
		
		g.textureCoords(0, u2, v2);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y2, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 2, 1);
		g.textureCoords(5, 1, 1, 1);
		
		g.vertex(x2, y2, z2);
		
		g.textureCoords(0, u2, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y2, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 2, 1);
		g.textureCoords(5, 1, 1, 0);
		
		g.vertex(x2, y2, z1);
		
		g.textureCoords(0, u1, v1);
		g.textureCoords(1, u1,v1, u2, v2);
		g.textureCoords(2, x1, y2, z1);
		g.textureCoords(3, x2, y2, z2);
		g.textureCoords(4, 0, 2, 1);
		g.textureCoords(5, 0, 1, 0);
		
		g.vertex(x1, y2, z1);

		g.endShape();
		g.popMatrix();
	}
	
	public CCVector3f position () {
		return _myPosition;
	}
	
	public CCVector3f edge() {
		float d = _myDimension.x;
		return new CCVector3f(_myPosition).add(new CCVector3f(d/2,0,d/2));
	}
	
	public void addToMesh (CCVBOMesh theMesh) {
			
		final float x1 = _myPosition.x - _myDimension.x / 2f;
		final float x2 = _myPosition.x + _myDimension.x / 2f;
		final float y1 = _myPosition.y - _myDimension.y / 2f;
		final float y2 = _myPosition.y + _myDimension.y / 2f;
		final float z1 = _myPosition.z - _myDimension.z / 2f;
		final float z2 = _myPosition.z + _myDimension.z / 2f;

	
		float u1,v1,u2,v2;
		u1 = (_myPosition.x + x1) / 1000 + 10;
		v1 = (_myPosition.y + y1) / 1000 + 10;
		u2 = (_myPosition.x + x2) / 1000 + 10;
		v2 = (_myPosition.y + y2) / 1000 + 10;
		
		// front
		//g.normal(0,0,-1);
		
		theMesh.addTextureCoords(0, u1,v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 1, 2);
		theMesh.addVertex(x1, y2, z1);
		
		theMesh.addTextureCoords(0, u2, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 1, 2);
		theMesh.addVertex(x2, y2, z1);
		
		theMesh.addTextureCoords(0, u2, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 1, 2);
		theMesh.addVertex(x2, y1, z1);
		
		theMesh.addTextureCoords(0, u1, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 1, 2);
		theMesh.addVertex(x1, y1, z1);
		
		u1 = (_myPosition.z + z1) / 1000 + 10;
		v1 = (_myPosition.y + y1) / 1000 + 10;
		u2 = (_myPosition.z + z2) / 1000 + 10;
		v2 = (_myPosition.y + y2) / 1000 + 10;

		// right
		theMesh.addTextureCoords(0, u1, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x2, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 2, 1, 0);
		theMesh.addVertex(x2, y2, z1);
		
		theMesh.addTextureCoords(0, u2, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x2, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 2, 1, 0);
		theMesh.addVertex(x2, y2, z2);
		
		theMesh.addTextureCoords(0, u2, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x2, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 2, 1, 0);
		theMesh.addVertex(x2, y1, z2);
		
		theMesh.addTextureCoords(0, u1, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x2, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 2, 1, 0);
		theMesh.addVertex(x2, y1, z1);
		
		u1 = (_myPosition.x + x1) / 1000 + 10;
		v1 = (_myPosition.y + y1) / 1000 + 10;
		u2 = (_myPosition.x + x2) / 1000 + 10;
		v2 = (_myPosition.y + y2) / 1000 + 10;

		// back
		theMesh.addTextureCoords(0, u2, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z2);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 1, 2);
		theMesh.addVertex(x2, y2, z2);
		
		theMesh.addTextureCoords(0, u1, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z2);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 1, 2);
		theMesh.addVertex(x1, y2, z2);
		
		theMesh.addTextureCoords(0, u1, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z2);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 1, 2);
		theMesh.addVertex(x1, y1, z2);
		
		theMesh.addTextureCoords(0, u2, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z2);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 1, 2);
		theMesh.addVertex(x2, y1, z2);
		
		u1 = (_myPosition.z + z1) / 1000 + 10;
		v1 = (_myPosition.y + y1) / 1000 + 10;
		u2 = (_myPosition.z + z2) / 1000 + 10;
		v2 = (_myPosition.y + y2) / 1000 + 10;

		// left
		theMesh.addTextureCoords(0, u2, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 2, 1, 0);
		theMesh.addVertex(x1, y2, z2);
		
		theMesh.addTextureCoords(0, u1, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 2, 1, 0);
		theMesh.addVertex(x1, y2, z1);
		
		theMesh.addTextureCoords(0, u1, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 2, 1, 0);
		theMesh.addVertex(x1, y1, z1);
		
		theMesh.addTextureCoords(0, u2, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 2, 1, 0);
		theMesh.addVertex(x1, y1, z2);
		
		u1 = (_myPosition.x + x1) / 1000 + 10;
		v1 = (_myPosition.z + z1) / 1000 + 10;
		u2 = (_myPosition.x + x2) / 1000 + 10;
		v2 = (_myPosition.z + z2) / 1000 + 10;

		// top
		theMesh.addTextureCoords(0, u1, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 2, 1);
		theMesh.addVertex(x1, y1, z1);
		
		theMesh.addTextureCoords(0, u2, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 2, 1);
		theMesh.addVertex(x2, y1, z1);
		
		theMesh.addTextureCoords(0, u2, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 2, 1);
		theMesh.addVertex(x2, y1, z2);
		
		theMesh.addTextureCoords(0, u1, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y1, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 2, 1);
		theMesh.addVertex(x1, y1, z2);
		
		u1 = (_myPosition.x + x1) / 1000 + 10;
		v1 = (_myPosition.z + z1) / 1000 + 10;
		u2 = (_myPosition.x + x2) / 1000 + 10;
		v2 = (_myPosition.z + z2) / 1000 + 10;

		// bottom
		theMesh.addTextureCoords(0, u1, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y2, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 2, 1);
		theMesh.addVertex(x1, y2, z2);
		
		theMesh.addTextureCoords(0, u2, v2);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y2, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 2, 1);
		theMesh.addVertex(x2, y2, z2);
		
		theMesh.addTextureCoords(0, u2, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y2, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 2, 1);
		theMesh.addVertex(x2, y2, z1);
		
		theMesh.addTextureCoords(0, u1, v1);
		theMesh.addTextureCoords(1, u1,v1, u2, v2);
		theMesh.addTextureCoords(2, x1, y2, z1);
		theMesh.addTextureCoords(3, x2, y2, z2);
		theMesh.addTextureCoords(4, 0, 2, 1);
		theMesh.addVertex(x1, y2, z1);

	}
}
